/*
 * Copyright (C) 2011 The Code Bakers
 * Authors: Cleuton Sampaio e Francisco Rodrigues
 * e-mail: thecodebakers@gmail.com
 * Project: http://code.google.com/p/biomago/
 * Site: http://thecodebakers.blogspot.com
 *
 * Licensed under the GNU GPL, Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://gplv3.fsf.org/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * @author Cleuton Sampaio e Francisco Rogrigues - thecodebakers@gmail.com
 */

package br.com.thecodebakers.biomago.business;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.thecodebakers.biomago.model.BioPlot;

/**
 * This is the main Biorithm calculator class.
 * Esta é a classe principal que calcula o biorritmo.
 * @author cleuton
 *
 */
public class BioCalculator {
	
	public static final int CICLO_EMOCIONAL = 28; 	// Emotional cycle days
	public static final int CICLO_FISICO = 23;    	// Physical cycle days
	public static final int CICLO_INTELECTUAL = 33; // Intelectual cycle days
	
	/**
	 * Calculates the position of three cycles according to the passed Date.
	 * Calcula a posição (em um senóide) dos três ciclos, de acordo com a data passada.
	 * @param data The desired date - A data desejada
	 * @param nascimento The Birth date - A data de nascimento
	 * @return The position in senoid graph - A posição na senóide.
	 */
	public static BioPlot calc (Date data, Date nascimento) {
		BioPlot bp = new BioPlot(data, 0.0, 0.0, 0.0);
		bp.setEmocional(calcCycle(data, nascimento, CICLO_EMOCIONAL));
		bp.setFisico(calcCycle(data, nascimento, CICLO_FISICO));
		bp.setIntelectual(calcCycle(data, nascimento, CICLO_INTELECTUAL));
		return bp;
	}

	private static double calcCycle(Date data, Date nascimento,
			int ciclo) {
		int dias = 0; 
		double angulo = 0.0;
		dias = (int) ((data.getTime() - nascimento.getTime()) / (24 * 60 * 60 * 1000));
		angulo = (Math.PI * 2 / (double) ciclo * (dias % ciclo));
		return 100 * Math.sin(angulo);
	}
	
	public static Date incrementDate(Date data) {
		Date returnDate = new Date();
		returnDate.setTime(data.getTime() + 1 * 24 * 60 * 60 * 1000); 
		return returnDate;
	}
	
	public static List<BioPlot> getDateList(Date nascimento, int dias) {
		List<BioPlot> lista = new ArrayList<BioPlot>();
		Date data = new Date();
		for (int x = 0; x < dias; x++) {
			lista.add(calc (data, nascimento));
			data = incrementDate(data);
		}
		return lista;
	}
	
}
